package br.com.financas.repository;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.financas.abstractions.IReceitaDataRepository;
import br.com.financas.entity.Receita;
import br.com.financas.entity.ReceitaData;
import br.com.financas.entity.Usuario;

public class ReceitaDataRepository implements IReceitaDataRepository<ReceitaData> {
	private EntityManager manager;
	
	public ReceitaDataRepository(EntityManager manager){
		this.manager =  manager;
	}

	@Override
	public void inserir(ReceitaData receitaData) throws Exception {
		try {
			manager.getTransaction().begin();
			manager.persist(receitaData);
			manager.getTransaction().commit();
		} catch (Exception e) {
			manager.getTransaction().rollback();
		}
		
		
	}

	@Override
	public boolean deletar(ReceitaData receitaData) throws Exception {
		boolean deletado = true;
		try {
			manager.getTransaction().begin();
			manager.remove(receitaData);
			manager.getTransaction().commit();
		} catch (Exception e) {
			manager.getTransaction().rollback();
			deletado = false;
		}

		return deletado;
	}

	@Override
	public void atualizar(ReceitaData receitaData) {
		try {
			manager.getTransaction().begin();
			manager.merge(receitaData);
			manager.getTransaction().commit();
		} catch (Exception e) {
			manager.getTransaction().rollback();
		}
		
	}

	@Override
	public List<ReceitaData> obterTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ReceitaData> obterPorUsuario(Usuario usuario) {
		List<ReceitaData> receitaDataList = new ArrayList<ReceitaData>();
		Query query;

		if (receitaDataList.size() == 0) {
			try {
				query = manager
						.createQuery("SELECT rd FROM ReceitaData rd WHERE rd.receita.conta.usuario = :usuario");
				query.setParameter("usuario", usuario);
				receitaDataList = query.getResultList();
			} catch (Exception e) {
				manager.getTransaction().rollback();
			}
		}

		return receitaDataList;
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ReceitaData> obterPorReceita(Receita receita) {
		List<ReceitaData> receitaDataList = new ArrayList<ReceitaData>();
		Query query;

		if (receitaDataList.size() == 0) {
			try {
				query = manager
						.createQuery("SELECT rd FROM ReceitaData rd WHERE rd.receita = :receita");
				query.setParameter("receita", receita);
				receitaDataList = query.getResultList();
			} catch (Exception e) {
				manager.getTransaction().rollback();
			}
		}

		return receitaDataList;
	}

}
